package co.edu.udea.herbario.dao.imp;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import co.edu.udea.herbario.dao.MunicipioDao;
import co.edu.udea.herbario.dto.Especie;
import co.edu.udea.herbario.dto.Municipio;
import co.edu.udea.herbario.excepcion.Excepcion;

/**
 * Esta clase contiene la implementacion de los metodos planteados en la interface 
 * MunicipioDao,los cuales son utilizados para gestionar los datos de persistencia
 * asociados a los municipios incluidos en la informacion de los ejemplares registrados
 * 
 * @author Lorena Orozco
 *
 */

public class MunicipioDaoImp extends HibernateDaoSupport implements MunicipioDao
{
	@Override
	public Municipio obtener(int cod) throws Excepcion
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Municipio muni = null;	//inicializacion de objeto tipo Municipio para almacenar el 
								//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Municipio asociado al codigo pasado como parametro
			muni = (Municipio)sesion.get(Municipio.class, cod);			
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return muni;	//retorna el elemento hallado en la tabla Municipio
	}

	@Override
	public int crear(Municipio mun) throws Excepcion
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//crea el elemento mun en la tabla Municipio
			getHibernateTemplate().save(mun);	
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa			
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);				
		}
		
		return res;	//retorna el valor de exito o fallo de la operacion
	}

	@Override
	public int eliminar(Municipio mun) throws Excepcion 
	{
		int res;	//instanciacion de objeto tipo entero para almacenar el valor del retorno
		
		try
		{
			//Modifica el estado del elemento de tipo Municipio dentro del sistema
			mun.setActivo(false);	//Se indica que el municipio esta inactivo
			getHibernateTemplate().update(mun);	//actualiza la informacion del elemento de tipo Municipio
			res = 1;	//almacena 1 como valor de retorno indicando que la operacion es exitosa			
		}
		catch (HibernateException e)
		{
			res = -1;	//almacena -1 indicando que la operacion fallo
			throw new Excepcion(e);				
		}

		return res;	//retorna el valor de exito o fallo de la operacion
	}

	@Override
	public Municipio obtenerMunicipioPorNombre(String nombre) throws Excepcion 
	{
		Session sesion = null;	//Se inicializa la variable para obtener la sesion
		Municipio municipio = null;	//inicializacion de objeto tipo Municipio para almacenar el 
									//valor de retorno
		
		try
		{
			sesion = getSession();	//se obtiene la sesion
			//se obtiene el elemento de tipo Municipio asociado al nombre pasado como parametro
			//se utiliza el metodo uniqueResult() ya que el nombre del municipio debe aparecer una sola vez
			//en la tabla Municipio
			municipio = (Municipio) sesion.createCriteria(Municipio.class).add(Restrictions.eq("municipio", nombre)).uniqueResult();
		}
		catch (HibernateException e)
		{
			throw new Excepcion(e);			
		}
		
		return municipio;	//retorna el elemento hallado en la tabla Municipio
	}
}
